/*
    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) 2010  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

*/

#ifndef SINGLETON_H
#define SINGLETON_H

#include <iostream>


template<typename T>
class SingletonDestroyer;

template<typename T>
class Singleton
{
	friend class SingletonDestroyer<T>;
	
	protected :
		
		Singleton()
		{ }

		~Singleton()
		{ }

		static void destroy()
		{
			if(_instance)
				delete _instance;
			_instance = NULL;
		}
		
	public :

		static T * getInstance()
		{
			if(!_instance)
				_instance = new T;

			return (static_cast<T*>(_instance));
		}
		
	protected :

		static T * _instance;
};

template<typename T>
struct SingletonDestroyer
{
	~SingletonDestroyer()
	{
		T::destroy();
	}
};

template <typename T>
T * Singleton<T>::_instance = NULL;


#include "Singleton.tpp"

#endif // SINGLETON_H






